#!/bin/bash
# SPDX-License-Identifier: LGPL-2.1-or-later
set -e

if ((NO_BUILD)); then
    exit 0
fi

# shellcheck source=/dev/null
. /usr/lib/os-release

if [ ! -f "pkg/$ID/PKGBUILD" ]; then
    echo "PKGBUILD not found at pkg/$ID/PKGBUILD, run mkosi once with -ff to make sure the PKGBUILD is cloned" >&2
    exit 1
fi

# We can't configure the source or build directory so we use symlinks instead to make sure they are in the
# expected locations.
ln --symbolic "$SRCDIR" "pkg/$ID/systemd-stable"
ln --symbolic "$BUILDDIR" "pkg/$ID/build"
# Because we run with --noextract we are responsible for making sure the source files appear in src/.
ln --symbolic . "pkg/$ID/src"

MKOSI_CFLAGS="-O0 -Wp,-U_FORTIFY_SOURCE"
if ((LLVM)); then
    # TODO: Remove -fno-sanitize-function when https://github.com/systemd/systemd/issues/29972 is fixed.
    MKOSI_CFLAGS="$MKOSI_CFLAGS -shared-libasan -fno-sanitize=function"
fi

MKOSI_LDFLAGS=""
if ((LLVM)) && [[ -n "$SANITIZERS" ]]; then
    MKOSI_LDFLAGS="$MKOSI_LDFLAGS -Wl,-rpath=$(clang --print-file-name="")lib/linux"
fi

MKOSI_MESON_OPTIONS="-D mode=developer -D b_sanitize=${SANITIZERS:-none}"
if ((WIPE)); then
    MKOSI_MESON_OPTIONS="$MKOSI_MESON_OPTIONS --wipe"
fi

# Override the default options. We specifically disable "strip", "zipman" and "lto" as they slow down builds
# significantly. OPTIONS= cannot be overridden on the makepkg command line so we append to /etc/makepkg.conf
# instead. The rootfs is overlaid with a writable tmpfs during the build script so these changes don't end up
# in the image itself.
tee --append /etc/makepkg.conf >/dev/null <<EOF
export CC="$( ((LLVM)) && echo clang || echo gcc)"
export CXX="$( ((LLVM)) && echo clang++ || echo g++)"
export CC_LD="$( ((LLVM)) && echo lld)"
export CXX_LD="$( ((LLVM)) && echo lld)"
export CFLAGS="\$CFLAGS $MKOSI_CFLAGS $CFLAGS"
export CXXFLAGS="\$CXXFLAGS $MKOSI_CFLAGS $CFLAGS"
export LDFLAGS="\$LDFLAGS $MKOSI_LDFLAGS $LDFLAGS"
OPTIONS=(
    docs
    !libtool
    !staticlibs
    emptydirs
    !zipman
    purge
    $( ((WITH_DEBUG)) && echo strip || echo !strip)
    $( ((WITH_DEBUG)) && echo debug || echo !debug)
    !lto
)
EOF

# Linting the PKGBUILD takes multiple seconds every build so avoid that by nuking all the linting functions.
rm /usr/share/makepkg/lint_pkgbuild/*

if [ -d .git/ ] && [ -z "$(git status --porcelain)" ]; then
    TS="$(git show --no-patch --format=%ct HEAD)"
else
    TS="${SOURCE_DATE_EPOCH:-$(date +%s)}"
fi

sed --in-place "pkg/$ID/PKGBUILD" \
    --expression "s/^_tag=.*/_tag=$(cat meson.version)/" \
    --expression "s/^pkgrel=.*/pkgrel=$(date "+%Y%m%d%H%M%S" --date "@$TS")/"

# We get around makepkg's root check by setting EUID to something else.
# shellcheck disable=SC2046
env --chdir="pkg/$ID" \
    EUID=123 \
    makepkg \
    --noextract \
    $( ((WITH_TESTS)) || echo --nocheck) \
    --force \
    _systemd_UPSTREAM=1 \
    _systemd_QUIET=$( ((MESON_VERBOSE)); echo $? ) \
    BUILDDIR="$PWD/pkg/$ID" \
    PKGDEST="$OUTPUTDIR" \
    PKGEXT=".pkg.tar" \
    MESON_EXTRA_CONFIGURE_OPTIONS="$MKOSI_MESON_OPTIONS $MESON_OPTIONS"

cp "$OUTPUTDIR"/*.pkg.tar "$PACKAGEDIR"
